<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>FileOpen</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/default.css" rel="stylesheet" type="text/css">
<style>.fopt{width:3em;text-align:center}.fnum{width:4em;text-align:right}</style>
</head>
<body>

<h1>FileOpen <span class="ver">[AHK_L 42+]</span></h1>

<p>打开文件.</p>
<pre class="Syntax">file := FileOpen(Filename, Flags [, Encoding])</pre>

<h3>参数</h3>
<table class="info">
  <tr><td width="15%">Filename</td><td width="85%">需打开文件的路径, 如果没有指定绝对路径则假定为 <a href="../Variables.htm#WorkingDir">A_WorkingDir</a>.</td></tr>
  <tr><td>Flags</td><td><span class="ver">[in AHK_L 54+]</span> 表示期望访问模式的字符串, 后面跟着其他选项 (中间可以含有空格或 Tab); 或 <span class="ver">[in AHK_L 42+]</span> 数值标志的组合 (总和). 在下面的表中描述了支持的值.</td></tr>
  <tr><td>Encoding</td><td>如果文件不包含 UTF-8 或 UTF-16 <a href="http://en.wikipedia.org/wiki/Byte_order_mark">字节顺序标记</a> 时文本 I/O 使用的代码页.<br> 如果省略, 则使用 <a href="../Variables.htm#FileEncoding">A_FileEncoding</a> 的当前值.</td></tr>
</table>
<h3>标志</h3>
<p></p>
<table class="info">
  <tr><th></th><th></th><th style="text-align:left">访问模式 (互斥的)</th></tr>
  <tr><td class="fopt">r</td><td class="fnum">0</td><td><i>读取:</i> 当文件不存在时失败.</td></tr>
  <tr><td class="fopt">w</td><td class="fnum">1</td><td><i>写入:</i> 创建新文件, <b style="color:red">覆盖任何现有的文件.</b></td></tr>
  <tr><td class="fopt">a</td><td class="fnum">2</td><td><i>附加:</i> 如果文件不存在则创建新文件.</td></tr>
  <tr><td class="fopt">rw</td><td class="fnum">3</td><td><i>读取/写入:</i> 如果文件不存在则创建新文件.</td></tr>
  <tr><td class="fopt">h</td><td></td><td>表示 <i>文件名</i> 是包装在对象中的文件句柄. 忽略共享模式标志. 当文件对象销毁时文件句柄 <b>不会</b> 自动关闭并且调用 <a href="../objects/File.htm#Close">Close</a> 没有效果. 注意当 <a href="../objects/File.htm#Seek">文件名</a> 是到非搜寻设备例如管道或通信设备的句柄时不应该使用 <a href="../objects/File.htm#Tell">Seek</a>, <a href="../objects/File.htm#Length">Tell</a> 和 <i>Length</i>.</td></tr>
  <tr><th></th><th></th><th style="text-align:left">共享模式标志</th></tr>
  <tr><td class="fopt">-rwd</td><td></td><td>为读取, 写入和/或删除访问进行文件锁定. 可以使用 <code>r</code>, <code>w</code> 和 <code>d</code> 的任意组合. 指定 <code>-</code> 相当于指定 <code>-rwd</code>. 如果完全省略, 默认为共享所有访问.</td></tr>
  <tr><td></td><td class="fnum">0</td><td>如果 <i>Flags</i> 是数值的, 缺少共享模式标志会使得文件被锁定.</td></tr>
  <tr><td></td><td class="fnum">0x100</td><td>共享 <i>读取</i> 访问.</td></tr>
  <tr><td></td><td class="fnum">0x200</td><td>共享 <i>写入</i> 访问.</td></tr>
  <tr><td></td><td class="fnum">0x400</td><td>共享 <i>删除</i> 访问.</td></tr>
  <tr><th></th><th></th><th style="text-align:left">行结束符 (EOL) 选项</th></tr>
  <tr><td class="fopt"><code>`n</code></td><td class="fnum">4</td><td>当读取时使用 <code>`n</code> 代替 <code>`r`n</code> 而写入时使用 <code>`r`n</code> 代替 <code>`n</code> .</td></tr>
  <tr><td class="fopt"><code>`r</code></td><td class="fnum">8</td><td>读取时使用 <code>`n</code> 替换单独的 <code>`r</code> .</td></tr>
</table>

<h3>返回值</h3>
<p>如果成功打开文件, 返回值为 <a href="../objects/File.htm">文件对象</a>.</p>
<p>如果函数失败, 返回值为 0 并且 <span class="ver">[in AHK_L 54+]</span> <a href="../Variables.htm#LastError">A_LastError</a> 包含错误代码.</p>
<p>使用 <code>if file</code> 或 <code>IsObject(file)</code> 可以检查函数是否成功执行.

<h3>备注</h3>
<p>当创建 UTF-8 或 UTF-16 文件时, 会写入字节顺序标记到文件中 <b>除非</b> <i>Encoding</i> (或 <i>A_FileEncoding</i>, 当 <i>Encoding</i> 省略时) 包含 "UTF-8-RAW" 或 "UTF-16-RAW".</p>

<h3>相关</h3>
<p><a href="FileEncoding.htm">FileEncoding</a>, <a href="../objects/File.htm">文件对象</a>, <a href="FileRead.htm">FileRead</a></p>

<h3>示例</h3>
<pre class="NoIndent"><em>; Open the script in read-only mode and read its first line:</em>
file := FileOpen(A_ScriptFullPath, "r") MsgBox % file.ReadLine()

<em>; Open the application's stdin/stdout handles in newline-translated mode. ; This can be tested by typing into the output pane of SciTE4AutoHotkey.</em>
stdin := FileOpen(DllCall("GetStdHandle", "int", -10, "ptr"), "h `n") stdout := FileOpen(DllCall("GetStdHandle", "int", -11, "ptr"), "h `n") stdout.Write("Enter your query.`n\&gt; ") query := RTrim(stdin.ReadLine(), "`n") stdout.WriteLine("Your query was '" query "'. Have a nice day.")
</pre>

</body>
</html>
